/*
 * crc.c
 *
 *  Created on: May 28, 2020
 *      Author: daniel
 */

#include "crc.h"

#define POLY 0x8005
/*
//                                      16   12   5
// this is the CCITT CRC 16 polynomial X  + X  + X  + 1.
// This works out to be 0x1021, but the way the algorithm works
// lets us use 0x8408 (the reverse of the bit pattern).  The high
// bit is always assumed to be set, thus we only use 16 bits to
// represent the 17 bit value.
*/

//unsigned short crc16(char *data_p, unsigned short length)
//{
//      unsigned char i;
//      unsigned int data;
//      unsigned int crc = 0xffff;
//
//      if (length == 0)
//            return (~crc);
//
//      do
//      {
//            for (i=0, data=(unsigned int)0xff & *data_p++;
//                 i < 8;
//                 i++, data >>= 1)
//            {
//                  if ((crc & 0x0001) ^ (data & 0x0001))
//                        crc = (crc >> 1) ^ POLY;
//                  else  crc >>= 1;
//            }
//      } while (--length);
//
//      crc = ~crc;
//      data = crc;
//      crc = (crc << 8) | (data >> 8 & 0xff);
//
//      return (crc);
//}

uint16_t MODBUS_CRC16_v2( const unsigned char *buf, unsigned int len )
{
	static const uint16_t table[2] = { 0x0000, 0xA001 };
	uint16_t crc = 0xFFFF;
	unsigned int i = 0;
	char bit = 0;
	unsigned int xor = 0;

	for( i = 0; i < len; i++ )
	{
		crc ^= buf[i];

		for( bit = 0; bit < 8; bit++ )
		{
			xor = crc & 0x01;
			crc >>= 1;
			crc ^= table[xor];
		}
	}

	return crc;
}

